﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExtEasy.Base;
using System.Collections.Specialized;
using System.Reflection;
using System.Collections;

namespace ExtEasy.Base
{
   
    /// <summary>
    /// класс объектной модели личной для каждого пользователя
    /// </summary>
    public class ExtModel : ExtControl
    {
        public ExtModel()
            : base()
        {
        }

        private MethodInfo _lastMethodInfo = null;
        public MethodInfo LastMethodInfo 
        {
            get
            {
                return _lastMethodInfo;
            }
            set
            {
                _lastMethodInfo = value;
                _lastMethod = string.Empty;
            }
        }


        //private MethodForLog _methodForLog = null;
        //public MethodForLog MethodForLog
        //{
        //    get
        //    {
        //        return _methodForLog;
        //    }
        //    set
        //    {
        //        _methodForLog = value;                
        //    }
        //}

        private string _lastMethod = "";
        public string LastMethod
        {
            get
            {
                if (!string.IsNullOrEmpty(_lastMethod)) return _lastMethod;
                if (LastMethodInfo == null) return "";
                /*object[] attr = LastMethodInfo.GetCustomAttributes(typeof(MethodForLog), true);
                if (attr.Length > 0 && attr[0] is MethodForLog)
                {
                    //MethodForLog mfl = (MethodForLog)attr[0];
                    _methodForLog = (MethodForLog)attr[0];
                    return _methodForLog.Name;            
                }
                _methodForLog = null;*/
                return LastMethodInfo.Name;
            }
            set
            {
                _lastMethod = value;
            }
        }

        public string LastParams { get; set; }
        public bool IsSuccess { get; set; }
        public string ServerScript { get; set; }
        public bool NeedRedirect = false;
        private Hashtable RegisteredControls;
        //public string ID { get; set; }

        /// <summary>
        /// Конструктор объектной модели. Присваиваем необходимые свойства контролам.
        /// </summary>
        /// <param name="id"></param>
        public ExtModel(string id)
            : base(id)
        {
            //ID = id;
        }  
        
        #region Methods        
        public override void Init(string id)
        {
            base.Init(id);
            RegisteredControls = new Hashtable();
        }

        public string RegisterControl(ExtControl ctrl, string key)
        {
            ctrl.CtrlKey = key;
            ctrl.Parent = this;
            RegisteredControls[key] = ctrl;
            return key;
            
        }

        public string RegisterControl(ExtControl ctrl)
        {
            string key = ExtUtils.GetMD5Hash(ctrl.ID + DateTime.Now.ToLongTimeString()).Substring(0, 5);
            return RegisterControl(ctrl, key);
        }
        #endregion   

        public ExtAjaxRes ProcessControlOperation(string key, NameValueCollection c)
        {
            ExtControl ctrl = RegisteredControls[key] as ExtControl;
            if (ctrl == null) throw new Exception("Контрол к ключем " + key+" не зарегисрирован в объектной модели!");
            return ctrl.ProcessOperation(c);
        }

        public override ExtAjaxRes ProcessOperation(NameValueCollection c)
        {
            return null;
        }
    }
}